package service;

import entity.SalaryPayment;

import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 * 薪酬发放服务接口
 * 定义了薪酬发放相关的业务方法
 */
public interface SalaryPaymentService {
    
    /**
     * 创建薪酬发放记录
     * @param empId 员工ID
     * @param standardId 薪酬标准ID
     * @param paymentMonth 发放月份（格式：yyyy-MM）
     * @param deduction 扣款金额
     * @param createUserId 创建人ID
     * @return 创建的发放记录ID
     * @throws IllegalArgumentException 如果参数无效
     */
    Long createSalaryPayment(Long empId, Long standardId, String paymentMonth, 
                           double deduction, Long createUserId);
    
    /**
     * 审核薪酬发放记录
     * @param paymentId 发放记录ID
     * @param approved 是否通过
     * @param reviewUserId 审核人ID
     * @throws IllegalArgumentException 如果参数无效或发放记录不存在
     */
    void reviewSalaryPayment(Long paymentId, boolean approved, Long reviewUserId);
    
    /**
     * 查找员工的所有薪酬发放记录
     * @param empId 员工ID
     * @return 发放记录列表
     */
    List<SalaryPayment> findByEmpId(Long empId);
    
    /**
     * 根据发放月份查找记录
     * @param paymentMonth 发放月份（格式：yyyy-MM）
     * @return 发放记录列表
     */
    List<SalaryPayment> findByPaymentMonth(String paymentMonth);
    
    /**
     * 根据薪酬标准查找发放记录
     * @param standardId 薪酬标准ID
     * @return 发放记录列表
     */
    List<SalaryPayment> findByStandardId(Long standardId);
    
    /**
     * 查找指定时间范围内的发放记录
     * @param startDate 开始时间
     * @param endDate 结束时间
     * @return 发放记录列表
     */
    List<SalaryPayment> findByCreateTimeBetween(Date startDate, Date endDate);
    
    /**
     * 根据审核状态查找发放记录
     * @param reviewStatus 审核状态
     * @return 发放记录列表
     */
    List<SalaryPayment> findByReviewStatus(Integer reviewStatus);
    
    /**
     * 查找指定审核人的发放记录
     * @param reviewUserId 审核人ID
     * @return 发放记录列表
     */
    List<SalaryPayment> findByReviewUserId(Long reviewUserId);
    
    /**
     * 根据实发工资范围查询
     * @param minAmount 最低实发工资
     * @param maxAmount 最高实发工资
     * @return 发放记录列表
     */
    List<SalaryPayment> findByTotalAmountBetween(double minAmount, double maxAmount);
    
    /**
     * 统计部门某月的薪酬发放记录
     * @param orgId 部门ID
     * @param paymentMonth 发放月份（格式：yyyy-MM）
     * @return 发放记录列表
     */
    List<SalaryPayment> findByOrgIdAndPaymentMonth(Long orgId, String paymentMonth);
    
    /**
     * 统计某月的薪酬发放总额
     * @param paymentMonth 发放月份（格式：yyyy-MM）
     * @return 发放总额
     */
    double sumTotalAmountByPaymentMonth(String paymentMonth);
    
    /**
     * 统计部门某月的薪酬发放总额
     * @param orgId 部门ID
     * @param paymentMonth 发放月份（格式：yyyy-MM）
     * @return 发放总额
     */
    double sumTotalAmountByOrgIdAndPaymentMonth(Long orgId, String paymentMonth);
    
    /**
     * 统计不同审核状态的记录数量
     * @param reviewStatus 审核状态
     * @return 记录数量
     */
    long countByReviewStatus(Integer reviewStatus);
    
    /**
     * 获取发放记录详细信息
     * @param paymentId 发放记录ID
     * @return 发放记录的详细信息
     * @throws IllegalArgumentException 如果发放记录不存在
     */
    Map<String, Object> getSalaryPaymentDetails(Long paymentId);
    
    /**
     * 检查审核状态是否有效
     * @param reviewStatus 审核状态
     * @return 如果状态有效返回true，否则返回false
     */
    default boolean isValidReviewStatus(Integer reviewStatus) {
        return reviewStatus != null && 
               (reviewStatus == SalaryPayment.REVIEW_STATUS_PENDING ||
                reviewStatus == SalaryPayment.REVIEW_STATUS_APPROVED ||
                reviewStatus == SalaryPayment.REVIEW_STATUS_REJECTED);
    }
    
    /**
     * 验证发放月份格式
     * @param paymentMonth 发放月份
     * @return 如果格式正确返回true，否则返回false
     */
    default boolean isValidPaymentMonth(String paymentMonth) {
        return paymentMonth != null && paymentMonth.matches("\\d{4}-\\d{2}");
    }
}
